延續前日介紹,今天我們來講Model內的fields延續昨日範例
# -*- coding: utf-8 -*-
from odoo import api, models, fields
class ResStudent(models.Model):
	_name = 'res.student'
    _inherit = 'res.partner'
    _description = 'Student'
	nickname = fields.Char(string='綽號')
	math_score = fields.Float(string='數學成績')
	chinese_score = fields.Float(string='國文成績')
 	avg_score = fields.Float(string='學期平均', compute='_compute_score')
	birthday = fields.Date(string='生日', required=True)
	school_id = fields.Many2one('res.company', string='所屬學校')
	school_city = fields.Char(string='所在城市', related='school_id.city')
    senior_id = fields.Many2one('res.student', string='直屬學長姐')
    junior_ids = fields.One2many('res.student', 'senior_id', string='直屬學弟妹')
	teacher_ids = fields.Many2many('res.teacher', string='指導老師', domain=[('is_active', '=', True)])
	gender = fields.Selection([("male", "男"), ("female", "女"), ("other", "其他")], string='性別')
	is_leadership = fields.Boolean(default=False)
    @api.depends('math_score', 'chinese_score')
    def _compute_total(self):
        for record in self:
            record.avg_score = (record.math_score + record.chinese_score) / 2
Fields對應的就是資料表內的欄位,我們可以設定Fields的型別以及內部屬性
True or False
gender ,內部的選項也可以拉出來寫。school_id ,通常會以_id為命名結尾,代表多個學生會對應到一個學校,其中學校是以res_company建立的model。junior_ids,通常以_ids為命名結尾,代表一位學生有多個直屬學弟妹。teacher_ids,命名同One2many,以_ids結尾,代表多位學生會對應到多位指導老師。在宣告Fields的時候可以帶參數去控制屬性,如欄位顯示名稱、初始值、是否必填...等,有部分屬性是在指定型別才可以加,以下介紹常用的幾項屬性:
通用欄位:
False。True 時代表無法寫入及修改。False。readonly, required, invisible 三項參數在UI上的顯示。True,但One2many 欄位和計算欄位預設為False。False。readonly=True、store=False,如範例中的avg_score 此欄位透過_compute_total 方法計算出欄位的值,本身不會儲存於db內,除非設定store=True 。school_city 便是參考school_id底下city的值。關聯欄位:
即是One2many、Many2one、Many2many三種fields會出現相關關聯參數:
school_id參考的即是res_company。One2many、Many2one欄位,可以想成是一個Filter,可透過domain來篩選想要的資料,如範例中的teacher_ids 透過filter,我們在指定給學生老師的時候只會選到is_active=True的老師。set null 、restrict 、cascad三種狀態分別代表設成Null、無法刪除、刪除關聯資料。ODOO會將預設欄位增加在model裡,也就是每個table中都會有此欄位:
透過ODOO model的設定,ORM可以幫我們做很多db操作,省去不少麻煩,更多fields設定在ODOO Document也有解說,明天我們來介紹Model下的methods。